from collections import OrderedDict

from fjr.models import SKU, SKUImage, SKUSpecification, GoodsSpecification, SpecificationOption, GoodsChannel, \
    GoodsCategory


def get_goods_and_spec(sku_id):

    # ======== 获取该商品和该商品对应的规格选项id ========
    # 根据 sku_id 获取该商品(sku)
    sku = SKU.objects.get(id=sku_id)
    # 获取该商品的图片
    sku.images = SKUImage.objects.filter(sku=sku)

    # ======== 获取类别下所有商品对应的规格选项id ========
    # 根据sku对象，获取对应的类别
    goods = sku.spu

    # 获取该类别下面的所有商品
    skus = SKU.objects.filter(spu=goods)

    dict = {}
    for temp_sku in skus:
        # 获取每一个商品(temp_sku)的规格参数
        sku_zuhe = SKUSpecification.objects.filter(sku=temp_sku).order_by('spec_id')

        temp_list = []
        for zuhe in sku_zuhe:
            # 规格 ----> 规格选项 ------> 规格选项id ------> 保存到 []
            temp_list.append(zuhe.option.id)

        # 把 list 转为 () 拼接成 k : v 保存到dict 中
        dict[tuple(temp_list)] = temp_sku.id

    # ======== 在每个选项上绑定对应的sku_id值 ========
    guige_list = GoodsSpecification.objects.filter(spu=goods).order_by('id')

    for index, guige in enumerate(guige_list):
        # 该规格的选项
        guige_xuanxiang = SpecificationOption.objects.filter(spec=guige)
        for xuanxiang in guige_xuanxiang:
            # 在规格参数sku 字典中查找符合当前规格的sku
            temp_list[index] = xuanxiang.id
            xuanxiang.sku_id = dict.get(tuple(temp_list))

        guige.spec_options = guige_xuanxiang

    return goods, guige_list, sku


def get_categories():

    # 定义一个有序字典
    dict = OrderedDict()

    # 对 GoodsChannel 进行 group_id 和 sequence 排序，获取排序后的结果
    channels = GoodsChannel.objects.order_by('group_id', 'sequence')

    # 遍历排序后的结果：得到所有的一级菜单
    for channel in channels:
        # 从频道中得到当前的组id
        group_id = channel.group_id

        # 判断：如果当前组id 不在我们的有序字典中
        if group_id not in dict:
            # 我们把组id 添加到有序字典中
            # 并且作为key 值， value值
            dict[group_id] = {
                'channels': [],
                'sub_cats': []
            }

        # 获取当前频道的分类名称
        cat1 = channel.category

        # 给刚刚创建的字典中，追加具体信息
        # 即，给'channels' 后面的 [] 里面添加如下信息
        dict[group_id]['channels'].append({
            'id': cat1.id,
            'name': cat1.name,
            'url': channel.url
        })
        cat2s = GoodsCategory.objects.filter(parent=cat1)
        # 获取二级菜单
        for cat2 in cat2s:
            cat2.sub_cats = []
            # 获取三级分类
            cat3s = GoodsCategory.objects.filter(parent=cat2)
            # 遍历
            for cat3 in cat3s:
                # 把三级菜单保存到cat2 对象属性中
                cat2.sub_cats.append(cat3)
            # 把cat2 对象保存到对应的列表中
            dict[group_id]['sub_cats'].append(cat2)

    return dict
